"""
带有参数的装饰器：
    装饰器装饰函数的时候可以传入指定参数

语法格式：@装饰器(参数,...)
    @decorator('+')
    def add(a, b):
        return a + b

带有参数装饰器的使用：
    需求：
        有如下 add和sub 2个函数，使用一个装饰器对二者装饰
    装饰产生的功能为：
        识别2个函数使用的是加法还是减法

结论：
    1.装饰器的外部函数只接收一个参数，就是被装饰的函数
    2.需要给装饰器传参数需要在装饰器的外部函数再增加一个函数
"""
from functools import wraps


# 函数装饰器
def logger(flag):
    """负责接收装饰器参数"""

    def decorator(func):
        """装饰器"""

        @wraps(func)
        def wrapper(*args, **kwargs):
            """内部函数"""
            # 判断流程
            if flag == '+':
                print("正在努力加法计算中...")
            elif flag == '-':
                print("正在努力减法计算中...")

            return func(*args, **kwargs)

        return wrapper

    return decorator


# 被带有参数的装饰器装饰的函数
@logger('+')
def add(a, b):
    """加法"""
    return a + b


@logger('-')
def sub(a, b):
    """减法"""
    return a - b


# 执行函数
result = add(1, 3)
print(result)
print(add.__name__)
print(add.__doc__)
